package io.gitee.welson.sensitive.writer;

import java.io.Closeable;
import java.io.Flushable;
import java.io.OutputStream;
import java.util.List;

/**
 * 导出写入器接口
 * 定义了基本的数据写入、关闭和刷新操作
 *
 * @author welson
 */
public interface ExportWriter extends Closeable, Flushable {

    /**
     * 批量写入数据，默认Sheet名称为Sheet1
     *
     * @param dataList 数据列表
     */
    void writeBatch(List<?> dataList);

    /**
     * 支持自动分页的批量写入数据，默认Sheet名称为Sheet1
     * 当数据列表数量超过最大行数限制时，会自动分页写入
     * 此时sheet页名称会会按照Sheet1,Sheet2,Sheet3...进行递增
     *
     * @param dataList 数据列表
     */
    void writeBatchWithPaging(List<?> dataList);

    /**
     * 批量写入数据到指定的sheet
     *
     * @param sheetName sheet名称
     * @param dataList  数据列表
     */
    void writeToSheet(String sheetName, List<?> dataList);

    /**
     * 支持分页的批量写入数据到指定的sheet
     * 当数据列表数量超过最大行数限制时，会自动分页写入
     * 此时sheetName表示sheet页名称前缀，sheet页名称会自动递增
     *
     * @param sheetName sheet名称
     * @param dataList  数据列表
     */
    void writeToSheetWithPaging(String sheetName, List<?> dataList);

    /**
     * 初始化导出器
     *
     * @param outputStream 输出流
     * @param dataClass   数据类型
     * @param <T>         数据泛型
     */
    <T> void initialize(OutputStream outputStream, Class<T> dataClass);

    /**
     * 设置当前导出任务的sheet页最大行数
     * @param maxRows 最大行数
     */
    void setSheetMaxRows(int maxRows);


    /**
     * 完成写入操作
     * 此方法会确保所有数据都被写入，并执行必要的清理工作
     */
    void finish();

    /**
     * 刷新写入器
     */
    @Override
    void flush();
} 